#ifndef TECLADO_TECLADO_H
#define TECLADO_TECLADO_H

#include "evento/evento.h"
#include "evento/tratador.h"
#include "SDL.h"
#include "tarefa/tarefa.h"
#include "util/singleton.h"

#include <set>
#include <map>

using namespace std;

#define TECLA ::teclado::teclado::getInstancia()
#define TECLA_APERTA(x, y) TECLA.cadastra_aperta(x, y)
#define TECLA_BAIXO(x, y) TECLA.cadastra_baixo(x, y)
#define TECLA_SOLTA(x, y) TECLA.cadastra_solta(x, y)

namespace teclado
{
typedef multimap<SDLKey, evento::tratador*>::iterator iterator_evento;
typedef multimap<SDLKey, tarefa::tarefa*>::iterator iterator_tarefa;
/**
  * \brief Gerenciador de teclado.
  *
  * Gerenciador de teclado.
  *
  * @author Daniel Fleischman
  * @date 29/01/2008
  */
class teclado : public evento::tratador,
                public tarefa::tarefa
{
  SINGLETON(teclado);
  public:
  virtual ~teclado();
  virtual void invoca(const evento::evento& event, int passou);
  virtual bool executa(int passou);
  iterator_evento cadastra_aperta(SDLKey key, evento::tratador* funcao);
  iterator_tarefa cadastra_baixo(SDLKey key, tarefa::tarefa* funcao);
  iterator_evento cadastra_solta(SDLKey key, evento::tratador* funcao);
  iterator_tarefa get_baixo(SDLKey tipo);
  void retira_baixo(iterator_tarefa it);
  iterator_evento get_aperta(SDLKey tipo);
  void retira_aperta(iterator_evento it);
  iterator_evento get_solta(SDLKey tipo);
  void retira_solta(iterator_evento it);
    
  private:
  multimap<SDLKey, evento::tratador*> mapa_aperta_;
  multimap<SDLKey, tarefa::tarefa*> mapa_baixo_;
  multimap<SDLKey, evento::tratador*> mapa_solta_;
  set<SDLKey> abaixados_;
  };
}
#endif
